import axios, {AxiosError} from 'axios'
import {Toast} from 'antd-mobile'
import { getToken, setToken } from './storage';
import store from '@/store';
import { logout } from '@/store/actions/login';
import history from './history';

const request = axios.create({
  baseURL: 'http://geek.itheima.net/v1_0/',
  timeout: 5000
})

const request2 = axios.create({
  baseURL: 'http://geek.itheima.net/v1_0/',
  timeout: 5000
})

request.interceptors.request.use(
  function (config) {
    // 在发送请求之前做些什么
    const token = getToken();
    if (token) {
      config.headers!.Authorization = `Bearer ${token.token}`
    }
    return config
  },
  function (error) {
    // 对请求错误做些什么
    return Promise.reject(error)
  }
);

request.interceptors.response.use(
  function (response) {
    // 对响应数据做点什么
    return response
  },
  async function (error: AxiosError<{message: string}>) {
    // 对响应错误做点什么
    if (!error.response) {
      // 网络延迟导致的error
      Toast.show('网络繁忙，稍后再试');
      return Promise.reject(error)
    } 
    // 1.判断是否401错误
    if (error.response.status === 401) {
      const token = getToken();
      //有token，token过期了
      if (token.token && token.refresh_token) {
        try {
          //因为封装的好的request，有请求拦截器，会带上过期的token，
          //所以使用新封装的request2
          const res = await request2({
            url: '/authorizations',
            method: 'put',
            headers: {
              Authorization: `Bearer ${token.refresh_token}`
            }
          })
          //将Token存到Redux
          store.dispatch({
            type: 'login/login',
            payload: {
              token: res.data.data.token,
              refresh_token: token.refresh_token
            }
          });
          //将Token存入localstorage
          setToken({
            token: res.data.data.token,
            refresh_token: token.refresh_token
          })
          //重新发送请求
          return request(error.config);
        } catch {
          //刷新Token失败
          // 1.移除Token
          store.dispatch(logout())
          // 2.跳转到登录页面
          history.replace('/login', {from: history.location.pathname});
        }
      } else {
        //没有Token
        //跳转到登录页面
        history.replace('/login', {from: history.location.pathname});
      }
    }

    Toast.show(error.response.data.message);
    return Promise.reject(error)
  }
);

export default request;